package com.itheima.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * 通知类
 */

@Aspect
@Component
public class AopAdvice {
   // 就是存放哪些抽取出来的逻辑代码(横切逻辑)

    @Pointcut("execution( * com.itheima.service.impl.*.*(..))")
    public void pt(){

    }

    // 环绕通知
    @Around("pt()")
    public Object countTime(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("代理对象在执行环绕通知");
        Signature signature = pjp.getSignature();
        // 得到被代理的类的信息
        Class declaringType = signature.getDeclaringType();
        // 得到方法的名字
        String methodName = signature.getName();
        // 获取 参数列表
        Object[] args = pjp.getArgs();
        for(Object obj:args){
            System.out.print("args:"+obj+" ");
        }
        System.out.println();
        // 方法执行之前
        long start = System.currentTimeMillis();
        // 执行目标对象方法的功能
        Object returnObj = pjp.proceed();
        long endTime = System.currentTimeMillis();
        System.out.println(declaringType.getName()+":"+methodName+" 耗时："+(endTime-start));
        // 方法执行之后
        return returnObj;
    }
//    long start = 0;
//
//    @Before("pt()")
//    public void countStart(){
//        start = System.currentTimeMillis();
//
//        System.out.println("方法执行前初始时间毫秒值是:"+start);
//    }
//
//    @After("pt()")
//    public void countEnd(){
//        System.out.println("方法执行后耗时:"
//            +(System.currentTimeMillis()-start));
//    }
}
